// LogStream.h	class LogStream

#ifndef _KC_LOG_STREAM__H_KC_
#define _KC_LOG_STREAM__H_KC_

#include <iostream>
#include <fstream>
#include <string>
#include <stdexcept>
#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread/mutex.hpp>

namespace kc_sf
{
	extern const std::string DEF_LOG_FILE;

	/**
	 * Klasa LogStream reprezentuje strumień logu. Aktualnie tylko plik.
	 * Można dopisać strumień znaków w pamięci.
	 *
	 * Zapewnia, że wątki mają zsynchronizowany dostęp do pliku logów, a
	 * zapis do pliku (metoda write) wykonywany jest atomowo.
	 *
	 * Klasa to singleton. Dostęp przez metodę getInstance().
	 */
	class LogStream : boost::noncopyable
	{
			// manipulator
			typedef std::ostream & (*OStreamManipPtr)( std::ostream& os );

		public:

			static LogStream &
			getInstance( const std::string &log_filename = DEF_LOG_FILE,
						 bool append = true );

			~LogStream();

			bool write( const std::string &log_message );       // znaczek_czasu wiadomość
			bool write( const std::string &priority,
						const std::string &log_message );       // znaczek_czasu priorytet wiadomość
			bool write( OStreamManipPtr manip );                // manipulator zapisu

			friend class Logger;

		private:

			std::ofstream	ls_stream;		// strumień pliku logów
			std::string		ls_filename;	// nazwa pliku logow

			boost::mutex	ls_guard;		// muteks strzegący dostępu do pliku logów

			explicit
			LogStream( const std::string &log_filename = DEF_LOG_FILE,
					   bool append = true );        // czy dopisywać do pliku, czy nadpisać jego zawartość

			bool open( bool append = true );    // UWAGA: objąć SK
			bool isOpened();		            // czy plik logu jest otwarty
			void close();
	};

	typedef boost::shared_ptr<LogStream> LogStreamPtr;
	typedef boost::shared_ptr<const LogStream> LogStreamConstPtr;

}

#endif // _KC_LOG_STREAM__H_KC_
